Trabalho Final - Ciência de Dados - Enap / 2020

Apresentação do Dataset

Foi utilizado como base para este Trabalho Final textos em formato pdf oriundos do sítio da OCDE (http://mneguidelines.oecd.org). Assim, as manipulações e análises realizadas se valeram, basicamente, da contagem da frequência das palavras encontradas em cada texto considerando a evolução histórica da linguagem utilizada.

Cole o link do dataset aqui Exemplo: https://www....

Para o ano de 2000, o texto mais representativo deve ser "OECD Guidelines for Multinational Enterprises, Revision 2000" disponivel em https://www.oecd-ilibrary.org/governance/oecd-guidelines-for-multinational-enterprises_9789264033979-en, mas não tive acesso pois está em área logada do sítio da OCDE.

Assim, utilizei um texto alternativo: http://www.oecd.org/daf/inv/mne/2000reviewoftheoecdguidelinesformultinationalenterprises.htm aide memoire , December 2000 = "https://www.oecd.org/corporate/mne/2439128.pdf"

Texto selecionado de 2011: path_Due_Diligence_Guidance = "http://www.oecd.org/daf/inv/mne/48004323.pdf"

Texto selecionado de 2018: path_Due_Diligence_Guidance = 'http://mneguidelines.oecd.org/OECD-Due-Diligence-Guidance-for-Responsible-Business-Conduct.pdf'

Motivação Pessoal

Objetivou-se aplicar as ferramentas apresentadas no curso e, também, testar a capacidade de enfrentar novos desafios numa tentativa de testar a capacidade de aprender a aprender.

Assim, considerando que muito recentemente passei a integrar a equipe do Ponto de Contato Nacional da CAMEX no Ministério da economia, intentei avaliar a evolução dos termos mais utilizados em textos específicos para avaliar a mudança na linguagem utiliada.

Sendo mais específico, o cerne era avaliar a alteração do discurso sobre as Políticas de Conduta Empresarial Responsável.

Investigação

Seguindo o ensinamento dado em sala de aula, tentei realizar todos os procedimentos necessários para o desenvolvimento do trabalho, ou seja, iniciando com o primeiro texto e passando por todas as etapas. Em seguida, novamente passando por todas as etapas, mas objetivando aprimorar tanto os scripts quanto a apresentação.

Até que, finalmente, seguisse para a consolidação e apresentação do resultado.

Assim, nesse jupyter será apresentado apenas o resultado final do trabalho, ou seja, a etapa: "3. Produção: objetivos: apresentar resultados e análises (05/12/2020)"

Etapas desenvolvidas no trabalho

  1. Pré-teste: objetivo é saber se é possível fazer. (29/11/2020)

    1. Selecionar os arquivos a serem lidos
    2. Ler os arquivos em pdf
    3. Contar palavras
    4. Limpar palavras sem significado
    5. Unir palavras compostas
    6. Plotar gráfico de nuvem total
    7. Plotar gráfico de nuvem por década? e comparar
  2. Teste: objetivos: aumentar a amostra de textos, verificar a validade da análise (03/12/2020)

    1. Selecionar os arquivos a serem lidos
    2. Ler os arquivos em pdf
    3. Contar palavras
    4. Limpar palavras sem significado
    5. Unir palavras compostas
    6. Plotar gráfico de nuvem total
    7. Plotar gráfico de nuvem por década? e comparar
  3. Produção: objetivos: apresentar resultados e análises (05/12/2020)

    1. Selecionar os arquivos a serem lidos
    2. Ler os arquivos em pdf
    3. Contar palavras
    4. Limpar palavras sem significado
    5. Unir palavras compostas
    6. Plotar gráfico de nuvem total
    7. Plotar gráfico de nuvem por década? e comparar

A seguir, serão apresentados os scripts desenvolvidos. Importante destacar que muitos dos códigos foram inspirados em soluções encontradas em pesquisas na internet, mas customizados para atender ao caso concreto.

In [1]:
# Install a pip package in the current Jupyter kernel
#Solução para instalar o pacote: PyPDF2
import sys
!{sys.executable} -m pip install PyPDF2
!{sys.executable} -m pip install wordcloud
!{sys.executable} -m pip install seaborn


#Pacotes usados
import PyPDF2 #leitor de pdf
from PyPDF2 import PdfFileMerger, PdfFileReader

from collections import Counter #contar palavras

from wordcloud import WordCloud, STOPWORDS, ImageColorGenerator #para núvem de palavras
import matplotlib.pyplot as plt #autoexplicativo
from matplotlib.colors import ListedColormap #alterar cores no gráfico
import matplotlib.gridspec as gridspec #diagramar
import matplotlib.image as mpimg #plotar imagens
import matplotlib.patheffects as path_effects #efeitos no texto

#mostrar o gráfico no próprio jupyter
%matplotlib inline 
import seaborn as sns
import pandas as pd #autoexplicativo
# from pandas.tools.plotting import table

#Configurações específicas de língua para português
import locale
locale.setlocale(locale.LC_ALL, 'pt_BR.UTF-8')

import os #auxiliar nos caminhos

from urllib import request #pacote para baixar pdf da internet
import urllib

from IPython.core.display import display, HTML
Requirement already satisfied: PyPDF2 in c:\users\marce\anaconda3\lib\site-packages (1.26.0)
Requirement already satisfied: wordcloud in c:\users\marce\anaconda3\lib\site-packages (1.8.1)
Requirement already satisfied: pillow in c:\users\marce\anaconda3\lib\site-packages (from wordcloud) (5.4.1)
Requirement already satisfied: matplotlib in c:\users\marce\anaconda3\lib\site-packages (from wordcloud) (3.0.3)
Requirement already satisfied: numpy>=1.6.1 in c:\users\marce\anaconda3\lib\site-packages (from wordcloud) (1.16.2)
Requirement already satisfied: cycler>=0.10 in c:\users\marce\anaconda3\lib\site-packages (from matplotlib->wordcloud) (0.10.0)
Requirement already satisfied: kiwisolver>=1.0.1 in c:\users\marce\anaconda3\lib\site-packages (from matplotlib->wordcloud) (1.0.1)
Requirement already satisfied: pyparsing!=2.0.4,!=2.1.2,!=2.1.6,>=2.0.1 in c:\users\marce\anaconda3\lib\site-packages (from matplotlib->wordcloud) (2.3.1)
Requirement already satisfied: python-dateutil>=2.1 in c:\users\marce\anaconda3\lib\site-packages (from matplotlib->wordcloud) (2.8.0)
Requirement already satisfied: six in c:\users\marce\anaconda3\lib\site-packages (from cycler>=0.10->matplotlib->wordcloud) (1.12.0)
Requirement already satisfied: setuptools in c:\users\marce\anaconda3\lib\site-packages (from kiwisolver>=1.0.1->matplotlib->wordcloud) (40.8.0)
Requirement already satisfied: seaborn in c:\users\marce\anaconda3\lib\site-packages (0.9.0)
Requirement already satisfied: numpy>=1.9.3 in c:\users\marce\anaconda3\lib\site-packages (from seaborn) (1.16.2)
Requirement already satisfied: scipy>=0.14.0 in c:\users\marce\anaconda3\lib\site-packages (from seaborn) (1.2.1)
Requirement already satisfied: pandas>=0.15.2 in c:\users\marce\anaconda3\lib\site-packages (from seaborn) (0.24.2)
Requirement already satisfied: matplotlib>=1.4.3 in c:\users\marce\anaconda3\lib\site-packages (from seaborn) (3.0.3)
Requirement already satisfied: python-dateutil>=2.5.0 in c:\users\marce\anaconda3\lib\site-packages (from pandas>=0.15.2->seaborn) (2.8.0)
Requirement already satisfied: pytz>=2011k in c:\users\marce\anaconda3\lib\site-packages (from pandas>=0.15.2->seaborn) (2018.9)
Requirement already satisfied: cycler>=0.10 in c:\users\marce\anaconda3\lib\site-packages (from matplotlib>=1.4.3->seaborn) (0.10.0)
Requirement already satisfied: kiwisolver>=1.0.1 in c:\users\marce\anaconda3\lib\site-packages (from matplotlib>=1.4.3->seaborn) (1.0.1)
Requirement already satisfied: pyparsing!=2.0.4,!=2.1.2,!=2.1.6,>=2.0.1 in c:\users\marce\anaconda3\lib\site-packages (from matplotlib>=1.4.3->seaborn) (2.3.1)
Requirement already satisfied: six>=1.5 in c:\users\marce\anaconda3\lib\site-packages (from python-dateutil>=2.5.0->pandas>=0.15.2->seaborn) (1.12.0)
Requirement already satisfied: setuptools in c:\users\marce\anaconda3\lib\site-packages (from kiwisolver>=1.0.1->matplotlib>=1.4.3->seaborn) (40.8.0)
In [2]:
#Verificar o local de trabalho
os.getcwd()
Out[2]:
'D:\\FCD\\ENAP\\trabalho_final'
In [3]:
#####----- FUNÇÕES USADO NO TRABALHO FINAL -----#####

###função para buscar os arquivos na internet
def download_file(download_url, filename):
    response = urllib.request.urlopen(download_url)    
    file = open(filename + ".pdf", 'wb')
    file.write(response.read())
    file.close()
    return (filename + ".pdf")

###função para extrair e consolidar texto
def extrai_texto(nome_arquivo):
    
    #Abre o documento
    pdfFileObj = open(nome_arquivo, 'rb') 
    
    # create an object of PdfFileReader class of PyPDF2 module and  pass the pdf file object & get a pdf reader object.
    pdfReader = PyPDF2.PdfFileReader(pdfFileObj)

    #iterar por todas as páginas e consolidar o texto de forma a ser lido no próxima etapa.
    i = 0
    palavras_final = ' '
    while i < pdfReader.getNumPages():
        pageObj = pdfReader.getPage(i)
        palavras_parcial = pageObj.extractText().upper()
        palavras_final = palavras_final + palavras_parcial
        i+=1

    pdfFileObj.close() # close the pdf file object.
    return palavras_final


###função para constuir a nuvem de palavras
def nuvem_palavras(palavras_final):
    
    #defini cores das palavras
    #mapa_cores = ListedColormap(['#DCDCDC', '#F0E68C', '#E9967A'])
    
    
    wordcloud = WordCloud(stopwords=stopwords,
                          background_color='white', 
                          #colormap = mapa_cores,
                          repeat=True,
                          width=1600,
                          height=800).generate(palavras_final)
    
    return wordcloud    


###Desenha o gráfico
def plotar_gráfico(wordcloud, nome_figura, ano):
    
    fig, ax = plt.subplots(figsize=(32,8))

    ax.imshow(wordcloud, interpolation='bilinear')       
    ax.set_axis_off()
    plt.title(ano, fontsize=40, color='#800000')
    
    plt.imshow(wordcloud)
    wordcloud.to_file(nome_figura + ".jpg");
    

###Imprimir as 10 palavras que mais se repetem
def maiores10(lista):
    dictlist = []
    for key in lista.words_.keys():
        temp = [key]
        dictlist.append(temp)
    df = pd.DataFrame(dictlist[:10]).rename(columns={0: "10 +"})
    return df

###Imprimir tabelas lado a lado - CÓPIGO COPIADO DA WEB
def display_side_by_side(dfs:list, captions:list):
    """Display tables side by side to save vertical space
    Input:
        dfs: list of pandas.DataFrame
        captions: list of table captions
    """
    output = ""
    combined = dict(zip(captions, dfs))
    for caption, df in combined.items():
        output += df.style.set_table_attributes("style='display:inline'").set_caption(caption)._repr_html_()
        output += "\xa0\xa0\xa0"
    display(HTML(output))
In [4]:
#A biblioteca STOPWORDS do pacote wordcloud é utilizada para eliminar 
#provérbios e algumas palavras que devem ser excluídas do texto, 
#exemplo (de, do, da, em, na, no, I, you) e entre outras.

stopwords = set(STOPWORDS) 

#caso queira acrescentar palavras!
stopwords.update(["e", ".","da", "meu", "em", "você", "de", "ao", "os", 'edition','may','g',
                 'MNE', 'SEE SECTION', 'WILL', 'ONE', 'ˆ ˆ', '^', 'b'])
In [5]:
### 1 - Baixar textos da web

##Caminho texto de 2018:
ocde_Due_Diligence_Guidance_for_RBC_2018 = 'http://mneguidelines.oecd.org/OECD-Due-Diligence-Guidance-for-Responsible-Business-Conduct.pdf'

#função para download: caminho e nome; atrubindo um nome para o arquivo para a próxima etapa
ocde_2018_pdf = download_file(ocde_Due_Diligence_Guidance_for_RBC_2018, "ocde_Due_Diligence_Guidance_for_RBC_2018")

##Caminho texto de 2011:
ocde_Guidelines_for_Multinational_Enterprises_2011_Edition = 'http://www.oecd.org/daf/inv/mne/48004323.pdf'

#função para download: caminho e nome; atrubindo um nome para o arquivo para a próxima etapa
ocde_2011_pdf = download_file(ocde_Guidelines_for_Multinational_Enterprises_2011_Edition,"ocde_Guidelines_for_Multinational_Enterprises_2011_Edition")


##Caminho texto de 2000:
ocde_Information_Meeting_2000 = 'https://www.oecd.org/corporate/mne/2439128.pdf'

#função para download: caminho e nome; atrubindo um nome para o arquivo para a próxima etapa nome
ocde_2000_pdf = download_file(ocde_Information_Meeting_2000, "ocde_Information_Meeting_2000")
In [6]:
###função para extrair e consolidar texto
ocde_2018_texto = extrai_texto(ocde_2018_pdf)
ocde_2011_texto = extrai_texto(ocde_2011_pdf)
ocde_2000_texto = extrai_texto(ocde_2000_pdf)
PdfReadWarning: Xref table not zero-indexed. ID numbers for objects will be corrected. [pdf.py:1736]
PdfReadWarning: Xref table not zero-indexed. ID numbers for objects will be corrected. [pdf.py:1736]
PdfReadWarning: Xref table not zero-indexed. ID numbers for objects will be corrected. [pdf.py:1736]
In [7]:
###função para constuir a nuvem de palavras
ocde_2018_cloud = nuvem_palavras(ocde_2018_texto)
ocde_2011_cloud = nuvem_palavras(ocde_2011_texto)
ocde_2000_cloud = nuvem_palavras(ocde_2000_texto)
In [8]:
###Desenha o gráfico
plotar_gráfico(ocde_2018_cloud, 'ocde_Due_Diligence_Guidance_for_RBC_2018', '2018')
plotar_gráfico(ocde_2011_cloud, 'ocde_Guidelines_for_Multinational_Enterprises_2011_Edition', '2011')
plotar_gráfico(ocde_2000_cloud, 'ocde_Information_Meeting_2000', '2000')
In [21]:
titulo = "Evolução da Linguagem - OCDE - Conduta Empresarial Resposável"
objetivo = """Objetivou-se aplicar as ferramentas apresentadas no curso e, também, testar a capacidade\n
        de enfrentar novos desafios numa tentativa de testar a capacidade de aprender a aprender. \n
        Assim, considerando que muito recentemente passei a integrar a equipe do Ponto de Contato Nacional \n
        da CAMEX no Ministério da economia, intentei avaliar a evolução dos termos mais utilizados em textos \n
        específicos para avaliar a mudança na linguagem utiliada."""
# Sendo mais específico, o cerne era avaliar a alteração do discurso sobre as Políticas de Conduta Empresarial Responsável.

conclusao = "Conclusões e Recomendações"
conclusao_texto = """Considerando que o objetivo do documento de 2018 era "ajudar as empresas a compreender\n
                    e aplicar a devida diligência para a CER, tal como prevista nas Diretrizes da OCDE para EMNs.\n
                    Este Guia também procura promover um entendimento comum entre governos e partes interessadas\n
                    sobre a devida diligência para a CER", ao que a nuvem de palavras indica, a OCDE evolui seu\n
                    discurso focando delegar maior responsabilidade pela conduta empresarial às próprias empresas.\n
                    E, ainda, fornecendo exemplos e definições do que é Conduta Empresaria Responsável."""
In [25]:
plt.figure(figsize=(60, 40))
G = gridspec.GridSpec(4, 3)

axes_1 = plt.subplot(G[0, :])
plt.xticks(())
plt.yticks(())
plt.title(titulo, fontsize=80, color='#800000')
plt.text(0.5, 0.5, objetivo, ha='center', va='center', size=50, alpha=.5)

axes_3 = plt.subplot(G[1:3, 0])
plt.xticks(())
plt.yticks(())
plt.title('2000', fontsize=80, color='#800000')

img = mpimg.imread('ocde_Information_Meeting_2000.jpg')
plt.imshow(img)

axes_4 = plt.subplot(G[1:3, 1])
plt.xticks(())
plt.yticks(())
plt.title('2011', fontsize=80, color='#800000')

img = mpimg.imread('ocde_Guidelines_for_Multinational_Enterprises_2011_Edition.jpg')
plt.imshow(img)

axes_5 = plt.subplot(G[1:3, 2])
plt.xticks(())
plt.yticks(())
plt.title('2018', fontsize=80, color='#800000')

img = mpimg.imread('ocde_Due_Diligence_Guidance_for_RBC_2018.jpg')
plt.imshow(img)

axes_2 = plt.subplot(G[3,:])
plt.xticks(())
plt.yticks(())
plt.title(conclusao, fontsize=80, color='#800000')
plt.text(0.5, 0.5, conclusao_texto, ha='center', va='center', size=50, alpha=.5, color='#000000')

plt.tight_layout()
plt.show()
In [11]:
#Rankando as palavras mais usadas em cada período
display_side_by_side([maiores10(ocde_2000_cloud), maiores10(ocde_2011_cloud),maiores10(ocde_2018_cloud)], 
                     ['10 + de 2000', '10 + de 2011', '10 + de 2018'])
10 + de 2000
10 +
0 GUIDELINES
1 OECD
2 DECLARATION
3 ISSUE
4 NON ADHERING
5 ADHERING COUNTRIES
6 COUNTRIES
7 GOVERNMENT
8 COUNTRY
9 INSTRUMENT
   
10 + de 2011
10 +
0 MULTINATIONAL ENTERPRISE
1 GUIDELINES
2 ENTERPRISE
3 OECD GUIDELINES
4 NCP
5 INFORMATION
6 ˆ ˆ
7 ENTERPRISES OECD
8 APPROPRIATE
9 RECOMMENDATION
   
10 + de 2018
10 +
0 ENTERPRISE
1 DUE DILIGENCE
2 ADVERSE IMPACT
3 BUSINESS RELATIONSHIP
4 RESPONSIBLE BUSINESS
5 BUSINESS CONDUCT
6 RISK
7 DILIGENCE GUIDANCE
8 EXAMPLE
9 ENTERPRISE S
   

Evoluções necessárias

1- Esmaecer (ou colorir de cinza claro) as palavras não relevante. 2- Acrescentar o ranking das palavras mais usada em cada ano.

Conclusões e Achados

Aparentemetne há uma evolução do discruso que no ano 2000 girava em torno da definição de diretrizes, declaração, questões e instrumentos para um foco nas empresas, informação e recomendação em 2011.

Já em 2018, passou-se a utilizar um discurso mais focado em termos como "DUE DILIGENCE", "RESPONSIBLE BUSINESS", "BUSINESS CONDUCT", "EXAMPLE" e "ADVERSE IMPACT".

Considerando que o objetivo do documento de 2018 era "ajudar as empresas a compreender e aplicar a devida diligência para a CER, tal como prevista nas Diretrizes da OCDE para EMNs. Este Guia também procura promover um entendimento comum entre governos e partes interessadas sobre a devida diligência para a CER", ao que a nuvem de palavras indica, a OCDE evolui seu discurso focando delegar maior responsabilidade pela conduta empresarial às próprias empresas. E, ainda, fornecendo exemplos e definições do que é Conduta Empresaria Responsável.

In [ ]:
 
In [ ]: